This code imports, cleans, and merges MODIS product data exported using the AppEEARS web application.
Exported MODIS data for the period 2000-2016:
- MOD11A2: LST Day 1km & LST Night 1km (8 day)
- MOD13Q1: EVI 250m & NDVI 250m (16 day)
- MOD15A2H: fPAR 500m & LAI 500m (8 day)
- MOD16A2: LE 500m & PET 500m (8 day)
- MOD17A2H: GPP 500m (8 day)
Data was exported for 50 BAMS paper sites (.csv format, “ID”, “Category”, “LAT”, “LONG”)
9 MODIS products are downloaded in 5 .csv files:
[1] "./BAMS-Sites-MOD11A2-006-results.csv" "./BAMS-Sites-MOD13Q1-006-results.csv"
[3] "./BAMS-Sites-MOD15A2H-006-results.csv" "./BAMS-Sites-MOD16A2-006-results.csv"
[5] "./BAMS-Sites-MOD17A2H-006-results.csv"
[[1]]
[[2]]
[[3]]
[[4]]
[[5]]
NA
Simplify data by removing unnecssary fields:
$lst_day
$vi
$lai
$et
$gpp
$lst_night
NA
Look at what the data quality levels are, convert good to 1, keep only 1s
[[1]]
[[2]]
[[3]]
[[4]]
[[5]]
[[6]]
Make a plot of daytime LST to make sure things look OK
ggplot(modis.filtered[[1]], aes(DATE, LST_D, col = as.factor(LAT))) +
geom_point()

Combine all the MODIS products for all sites and years into one dataframe
lst_d.filtered <- modis.filtered$lst_day %>% mutate(PRODUCT = rep("LST_D",length(LAT)), VAL = LST_D) %>% select(LAT, LONG, DATE, PRODUCT, VAL)
lst_n.filtered <- modis.filtered$lst_night %>% mutate(PRODUCT = rep("LST_N",length(LAT)), VAL = LST_N) %>% select(LAT, LONG, DATE, PRODUCT, VAL)
evi.filtered <- modis.filtered$vi %>% mutate(PRODUCT = rep("EVI",length(LAT)), VAL = EVI) %>% select(LAT, LONG, DATE, PRODUCT, VAL)
ndvi.filtered <- modis.filtered$vi %>% mutate(PRODUCT = rep("NDVI",length(LAT)), VAL = NDVI) %>% select(LAT, LONG, DATE, PRODUCT, VAL)
fpar.filtered <- modis.filtered$lai %>% mutate(PRODUCT = rep("FPAR",length(LAT)), VAL = FPAR) %>% select(LAT, LONG, DATE, PRODUCT, VAL)
lai.filtered <- modis.filtered$lai %>% mutate(PRODUCT = rep("LAI",length(LAT)), VAL = LAI) %>% select(LAT, LONG, DATE, PRODUCT, VAL)
gpp.filtered <- modis.filtered$gpp %>% mutate(PRODUCT = rep("GPP",length(LAT)), VAL = GPP) %>% select(LAT, LONG, DATE, PRODUCT, VAL)
le.filtered <- modis.filtered$et %>% mutate(PRODUCT = rep("LE",length(LAT)), VAL = LE) %>% select(LAT, LONG, DATE, PRODUCT, VAL)
pet.filtered <- modis.filtered$et %>% mutate(PRODUCT = rep("PET",length(LAT)), VAL = PET) %>% select(LAT, LONG, DATE, PRODUCT, VAL)
modis.filtered <- rbind(lst_d.filtered,lst_n.filtered,evi.filtered,ndvi.filtered,fpar.filtered,lai.filtered,
gpp.filtered,le.filtered,pet.filtered)
modis.filtered$PRODUCT <- as.factor(modis.filtered$PRODUCT)
str(modis.filtered)
Classes ‘tbl_df’, ‘tbl’ and 'data.frame': 200018 obs. of 5 variables:
$ LAT : num 27.2 27.2 27.2 27.2 27.2 ...
$ LONG : num -81.2 -81.2 -81.2 -81.2 -81.2 ...
$ DATE : Date, format: "2000-03-13" "2000-03-21" "2000-03-29" ...
$ PRODUCT: Factor w/ 9 levels "EVI","FPAR","GPP",..: 6 6 6 6 6 6 6 6 6 6 ...
$ VAL : num 305 307 307 307 308 ...
Finally , join the observations to the Site List on the latitude column:
modis.full <- full_join(bams.sites, modis.filtered, by =c("LAT","LONG"))
str(modis.full)
'data.frame': 206698 obs. of 7 variables:
$ ID : Factor w/ 50 levels "BCBog","BCFEN",..: 21 21 21 21 21 21 21 21 21 21 ...
$ Category: Factor w/ 5 levels "CRO_OTHER","CRO_RICE",..: 5 5 5 5 5 5 5 5 5 5 ...
$ LAT : num 68.3 68.3 68.3 68.3 68.3 ...
$ LONG : num 19.1 19.1 19.1 19.1 19.1 ...
$ DATE : Date, format: "2000-04-06" "2000-05-16" "2000-07-03" ...
$ PRODUCT : Factor w/ 9 levels "EVI","FPAR","GPP",..: 6 6 6 6 6 6 6 6 6 6 ...
$ VAL : num 269 278 284 289 291 ...
Finished! Save as .csv
# set wd
setwd("C:/Users/Gavin McNicol/Box Sync/MODIS Data/AppEEARS Data/bams-sites")
The working directory was changed to C:/Users/Gavin McNicol/Box Sync/MODIS Data/AppEEARS Data/bams-sites inside a notebook chunk. The working directory will be reset when the chunk is finished running. Use the knitr root.dir option in the setup chunk to change the working directory for notebook chunks.
write.csv(modis.full, "bams_sites_MODIS_full.csv")
LS0tDQp0aXRsZTogIlByZXBhcmUgTU9ESVMgRGF0YSINCm91dHB1dDogaHRtbF9ub3RlYm9vaw0KLS0tDQoNClRoaXMgY29kZSBpbXBvcnRzLCBjbGVhbnMsIGFuZCBtZXJnZXMgTU9ESVMgcHJvZHVjdCBkYXRhIGV4cG9ydGVkIHVzaW5nIHRoZSBbQXBwRUVBUlNdKGh0dHBzOi8vbHBkYWFjc3ZjLmNyLnVzZ3MuZ292L2FwcGVlYXJzKSB3ZWIgYXBwbGljYXRpb24uDQoNCkV4cG9ydGVkIE1PRElTIGRhdGEgZm9yIHRoZSBwZXJpb2QgMjAwMC0yMDE2Og0KDQoqICoqTU9EMTFBMjoqKiBMU1QgRGF5IDFrbSAmIExTVCBOaWdodCAxa20gKDggZGF5KQ0KKiAqKk1PRDEzUTE6KiogRVZJIDI1MG0gJiBORFZJIDI1MG0gKDE2IGRheSkNCiogKipNT0QxNUEySDoqKiBmUEFSIDUwMG0gJiBMQUkgNTAwbSAoOCBkYXkpDQoqICoqTU9EMTZBMjoqKiBMRSA1MDBtICYgUEVUIDUwMG0gKDggZGF5KQ0KKiAqKk1PRDE3QTJIOioqIEdQUCA1MDBtICg4IGRheSkNCg0KRGF0YSB3YXMgZXhwb3J0ZWQgZm9yIDUwIEJBTVMgcGFwZXIgc2l0ZXMgKC5jc3YgZm9ybWF0LCAiSUQiLCAiQ2F0ZWdvcnkiLCAiTEFUIiwgIkxPTkciKQ0KYGBge3IgZWNobz1GQUxTRSwgd2FybmluZz1GQUxTRSwgbWVzc2FnZT1GQUxTRX0NCiMgY2xlYXIgd29ya3NwYWNlIGFuZCBnZXQgd2QNCnJtKGxpc3Q9bHMoKSkNCiMgY2hhbmdlIHdkDQpzZXR3ZCgiQzovVXNlcnMvR2F2aW4gTWNOaWNvbC9Cb3ggU3luYy9NT0RJUyBEYXRhL0FwcEVFQVJTIERhdGEvIikNCmJhbXMuc2l0ZXMgPC0gcmVhZC5jc3YoIkFwcEVFQVJTX3NpdGVzLmNzdiIpDQpuYW1lcyhiYW1zLnNpdGVzKVtjKDMsNCldIDwtIGMoIkxBVCIsICJMT05HIikNCmJhbXMuc2l0ZXMNCmBgYA0KDQoNCmBgYHtyIGVjaG89RkFMU0V9DQojIGxpYnJhcmllcw0KIyBsb2FkIHRpZHl2ZXJzZSBsaWJyYXJpZXMNCmxpYnJhcnkoZHBseXIpDQpsaWJyYXJ5KHRpZHlyKQ0KbGlicmFyeShyZWFkcikNCmxpYnJhcnkocmVhZHhsKQ0KbGlicmFyeShzdHJpbmdyKQ0KbGlicmFyeShsdWJyaWRhdGUpDQpsaWJyYXJ5KFJDb2xvckJyZXdlcikNCmxpYnJhcnkoZ2dwbG90MikNCmxpYnJhcnkoZGF0YS50YWJsZSkNCmxpYnJhcnkobWFncml0dHIpDQpsaWJyYXJ5KGNhcmV0KQ0KbGlicmFyeShjYVRvb2xzKQ0KbGlicmFyeShyYW5nZXIpDQpsaWJyYXJ5KHRpYmJsZSkNCmBgYA0KDQo5IE1PRElTIHByb2R1Y3RzIGFyZSBkb3dubG9hZGVkIGluIDUgLmNzdiBmaWxlczoNCmBgYHtyIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0UsIGVjaG89RkFMU0V9DQojIGNoYW5nZSB3ZA0Kc2V0d2QoIkM6L1VzZXJzL0dhdmluIE1jTmljb2wvQm94IFN5bmMvTU9ESVMgRGF0YS9BcHBFRUFSUyBEYXRhL2JhbXMtc2l0ZXMiKQ0KIyBnZXQgc2l0ZSBuYW1lcyBmcm9tIGRpcmVjdG9yeQ0Kc2l0ZS5uYW1lcyA8LSBsaXN0LmZpbGVzKHBhdHRlcm4gPSAiXFwuY3N2JCIsZnVsbC5uYW1lcz1UUlVFKQ0Kc2l0ZS5uYW1lcw0KICAjIGNyZWF0ZSBsaXN0IG9mIHByb2R1Y3RzDQptb2RpcyA8LSBsaXN0KCkNCiMgY3JlYXRlIGEgZnVuY3Rpb24gdG8gcmVhZCBtYW55IGNzdnMNCnJlYWQubWFueS5jc3YgPC0gZnVuY3Rpb24oaSl7DQogIHJlYWQuY3N2KGksIGhlYWRlcj1UUlVFKQ0KfQ0KIyBleGVjdXRlIGZ1bmN0aW9uIHdpdGggc2l0ZS5uYW1lcw0KbW9kaXMgPC0gbGFwcGx5KHNpdGUubmFtZXMsIHJlYWQubWFueS5jc3YpDQptb2Rpcw0KYGBgDQpTaW1wbGlmeSBkYXRhIGJ5IHJlbW92aW5nIHVubmVjc3NhcnkgZmllbGRzOg0KYGBge3IgZWNobyA9IEZBTFNFfQ0KbHN0Lm5hbWVzIDwtIG5hbWVzKG1vZGlzW1sxXV1bYygzLDQsNSw5LDEwLDE1LDI0KV0pIA0KdmkubmFtZXMgPC0gbmFtZXMobW9kaXNbWzJdXVtjKDMsNCw1LDksMTAsMTQpXSkNCmxhaS5uYW1lcyA8LSBuYW1lcyhtb2Rpc1tbM11dW2MoMyw0LDUsOSwxMCwxNCldKQ0KZXQubmFtZXMgPC0gbmFtZXMobW9kaXNbWzRdXVtjKDMsNCw1LDksMTAsMTQpXSkNCmdwcC5uYW1lcyA8LSBuYW1lcyhtb2Rpc1tbNV1dW2MoMyw0LDUsOSwxMyldKQ0KbmFtZXMudmVjIDwtIGxpc3QobHN0Lm5hbWVzLHZpLm5hbWVzLCBsYWkubmFtZXMsIGV0Lm5hbWVzLCBncHAubmFtZXMpDQptb2Rpcy5zaW1wbGUgPC0gbGlzdCgpDQpmb3IgKGkgaW4gMTpsZW5ndGgobW9kaXMpKXsNCiAgICAgbW9kaXMuc2ltcGxlW1tpXV0gPC0gYXNfdGliYmxlKG1vZGlzW1tpXV1bbmFtZXMudmVjW1tpXV1dKQ0KICAgICBtb2Rpcy5zaW1wbGVbW2ldXSREYXRlIDwtIGFzX2RhdGUobW9kaXMuc2ltcGxlW1tpXV0kRGF0ZSkNCn0NCiNzcGxpdCBuaWdodCBhbmQgZGF5IExTVDsgZXZpIGFuZCBORFZJOyBMQUkgYW5kIGZQQVIuDQptb2Rpcy5zaW1wbGVbWzZdXSA8LSBtb2Rpcy5zaW1wbGVbWzFdXSAlPiUgc2VsZWN0KExhdGl0dWRlLCBMb25naXR1ZGUsIERhdGUsIE1PRDExQTJfMDA2X0xTVF9OaWdodF8xa20sIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNT0QxMUEyXzAwNl9RQ19OaWdodF9NT0RMQU5EX0Rlc2NyaXB0aW9uKQ0KbW9kaXMuc2ltcGxlW1sxXV0gPC0gbW9kaXMuc2ltcGxlW1sxXV0gJT4lIHNlbGVjdChMYXRpdHVkZSwgTG9uZ2l0dWRlLCBEYXRlLCBNT0QxMUEyXzAwNl9MU1RfRGF5XzFrbSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTU9EMTFBMl8wMDZfUUNfRGF5X01PRExBTkRfRGVzY3JpcHRpb24pDQpuYW1lcyhtb2Rpcy5zaW1wbGUpIDwtIGMoImxzdF9kYXkiLCJ2aSIsImxhaSIsImV0IiwiZ3BwIiwibHN0X25pZ2h0IikNCm1vZGlzLnNpbXBsZQ0KYGBgDQpMb29rIGF0IHdoYXQgdGhlIGRhdGEgcXVhbGl0eSBsZXZlbHMgYXJlLCBjb252ZXJ0IGdvb2QgdG8gMSwga2VlcCBvbmx5IDFzDQpgYGB7ciBlY2hvPSBGQUxTRX0NCiNjb252ZXJ0IGxldmVscyB0byBmYWN0b3INCmxldmVscyhtb2Rpcy5zaW1wbGVbWzFdXVtbNV1dKSA8LSBhcy5mYWN0b3IoYygwLDEsMCkpDQpsZXZlbHMobW9kaXMuc2ltcGxlW1syXV1bWzZdXSkgPC0gYXMuZmFjdG9yKGMoMCwwLDEsMCkpDQpsZXZlbHMobW9kaXMuc2ltcGxlW1szXV1bWzZdXSkgPC0gYXMuZmFjdG9yKGMoMSwwKSkNCmxldmVscyhtb2Rpcy5zaW1wbGVbWzRdXVtbNl1dKSA8LSBhcy5mYWN0b3IoYygxLDApKQ0KbGV2ZWxzKG1vZGlzLnNpbXBsZVtbNV1dW1s1XV0pIDwtIGFzLmZhY3RvcihjKDEsMCkpDQpsZXZlbHMobW9kaXMuc2ltcGxlW1s2XV1bWzVdXSkgPC0gYXMuZmFjdG9yKGMoMCwxLDApKQ0KI3JlbmFtZSB2YXJpYWJsZXMNCm5hbWVzKG1vZGlzLnNpbXBsZVtbMV1dKSA8LSBjKCJMQVQiLCAiTE9ORyIsICJEQVRFIiwgIkxTVF9EIiwgIlFVQUxJVFkiKQ0KbmFtZXMobW9kaXMuc2ltcGxlW1syXV0pIDwtIGMoIkxBVCIsICJMT05HIiwgIkRBVEUiLCAiRVZJIiwgIk5EVkkiLCAiUVVBTElUWSIpDQpuYW1lcyhtb2Rpcy5zaW1wbGVbWzNdXSkgPC0gYygiTEFUIiwgIkxPTkciLCAiREFURSIsICJGUEFSIiwgIkxBSSIsICJRVUFMSVRZIikNCm5hbWVzKG1vZGlzLnNpbXBsZVtbNF1dKSA8LSBjKCJMQVQiLCAiTE9ORyIsICJEQVRFIiwgIkxFIiwgIlBFVCIsICJRVUFMSVRZIikNCm5hbWVzKG1vZGlzLnNpbXBsZVtbNV1dKSA8LSBjKCJMQVQiLCAiTE9ORyIsICJEQVRFIiwgIkdQUCIsICJRVUFMSVRZIikNCm5hbWVzKG1vZGlzLnNpbXBsZVtbNl1dKSA8LSBjKCJMQVQiLCAiTE9ORyIsICJEQVRFIiwgIkxTVF9OIiwgIlFVQUxJVFkiKQ0KIyBtb2Rpcy5zaW1wbGUNCg0KbW9kaXMuZmlsdGVyZWQgPC0gbGlzdCgpDQpmb3IgKGkgaW4gMTpsZW5ndGgobW9kaXMuc2ltcGxlKSl7DQogIG1vZGlzLmZpbHRlcmVkW1tpXV0gPC0gYXNfdGliYmxlKG1vZGlzLnNpbXBsZVtbaV1dICU+JSBmaWx0ZXIoUVVBTElUWSA9PSAxKSkNCn0NCm1vZGlzLmZpbHRlcmVkDQpuYW1lcyhtb2Rpcy5maWx0ZXJlZCkgPC0gYygibHN0X2RheSIsInZpIiwibGFpIiwiZXQiLCJncHAiLCJsc3RfbmlnaHQiKQ0KYGBgDQpNYWtlIGEgcGxvdCBvZiBkYXl0aW1lIExTVCB0byBtYWtlIHN1cmUgdGhpbmdzIGxvb2sgT0sNCmBgYHtyfQ0KZ2dwbG90KG1vZGlzLmZpbHRlcmVkW1sxXV0sIGFlcyhEQVRFLCBMU1RfRCwgY29sID0gYXMuZmFjdG9yKExBVCkpKSArDQogIGdlb21fcG9pbnQoKQ0KYGBgDQpDb21iaW5lIGFsbCB0aGUgTU9ESVMgcHJvZHVjdHMgZm9yIGFsbCBzaXRlcyBhbmQgeWVhcnMgaW50byBvbmUgZGF0YWZyYW1lDQpgYGB7cn0NCmxzdF9kLmZpbHRlcmVkIDwtIG1vZGlzLmZpbHRlcmVkJGxzdF9kYXkgJT4lIG11dGF0ZShQUk9EVUNUID0gcmVwKCJMU1RfRCIsbGVuZ3RoKExBVCkpLCBWQUwgPSBMU1RfRCkgJT4lIHNlbGVjdChMQVQsIExPTkcsIERBVEUsIFBST0RVQ1QsIFZBTCkNCmxzdF9uLmZpbHRlcmVkIDwtIG1vZGlzLmZpbHRlcmVkJGxzdF9uaWdodCAlPiUgbXV0YXRlKFBST0RVQ1QgPSByZXAoIkxTVF9OIixsZW5ndGgoTEFUKSksIFZBTCA9IExTVF9OKSAlPiUgc2VsZWN0KExBVCwgTE9ORywgREFURSwgUFJPRFVDVCwgVkFMKQ0KZXZpLmZpbHRlcmVkIDwtIG1vZGlzLmZpbHRlcmVkJHZpICU+JSBtdXRhdGUoUFJPRFVDVCA9IHJlcCgiRVZJIixsZW5ndGgoTEFUKSksIFZBTCA9IEVWSSkgJT4lIHNlbGVjdChMQVQsIExPTkcsIERBVEUsIFBST0RVQ1QsIFZBTCkNCm5kdmkuZmlsdGVyZWQgPC0gbW9kaXMuZmlsdGVyZWQkdmkgICU+JSBtdXRhdGUoUFJPRFVDVCA9IHJlcCgiTkRWSSIsbGVuZ3RoKExBVCkpLCBWQUwgPSBORFZJKSAlPiUgc2VsZWN0KExBVCwgTE9ORywgREFURSwgUFJPRFVDVCwgVkFMKQ0KZnBhci5maWx0ZXJlZCA8LSBtb2Rpcy5maWx0ZXJlZCRsYWkgICU+JSBtdXRhdGUoUFJPRFVDVCA9IHJlcCgiRlBBUiIsbGVuZ3RoKExBVCkpLCBWQUwgPSBGUEFSKSAlPiUgc2VsZWN0KExBVCwgTE9ORywgREFURSwgUFJPRFVDVCwgVkFMKQ0KbGFpLmZpbHRlcmVkIDwtIG1vZGlzLmZpbHRlcmVkJGxhaSAgJT4lIG11dGF0ZShQUk9EVUNUID0gcmVwKCJMQUkiLGxlbmd0aChMQVQpKSwgVkFMID0gTEFJKSAlPiUgc2VsZWN0KExBVCwgTE9ORywgREFURSwgUFJPRFVDVCwgVkFMKQ0KZ3BwLmZpbHRlcmVkIDwtIG1vZGlzLmZpbHRlcmVkJGdwcCAlPiUgbXV0YXRlKFBST0RVQ1QgPSByZXAoIkdQUCIsbGVuZ3RoKExBVCkpLCBWQUwgPSBHUFApICU+JSBzZWxlY3QoTEFULCBMT05HLCBEQVRFLCBQUk9EVUNULCBWQUwpIA0KbGUuZmlsdGVyZWQgPC0gbW9kaXMuZmlsdGVyZWQkZXQgJT4lIG11dGF0ZShQUk9EVUNUID0gcmVwKCJMRSIsbGVuZ3RoKExBVCkpLCBWQUwgPSBMRSkgJT4lICBzZWxlY3QoTEFULCBMT05HLCBEQVRFLCBQUk9EVUNULCBWQUwpIA0KcGV0LmZpbHRlcmVkIDwtIG1vZGlzLmZpbHRlcmVkJGV0ICU+JSBtdXRhdGUoUFJPRFVDVCA9IHJlcCgiUEVUIixsZW5ndGgoTEFUKSksIFZBTCA9IFBFVCkgJT4lIHNlbGVjdChMQVQsIExPTkcsIERBVEUsIFBST0RVQ1QsIFZBTCkgDQoNCm1vZGlzLmZpbHRlcmVkIDwtIHJiaW5kKGxzdF9kLmZpbHRlcmVkLGxzdF9uLmZpbHRlcmVkLGV2aS5maWx0ZXJlZCxuZHZpLmZpbHRlcmVkLGZwYXIuZmlsdGVyZWQsbGFpLmZpbHRlcmVkLA0KICAgICAgICAgICAgICAgICAgICAgICAgZ3BwLmZpbHRlcmVkLGxlLmZpbHRlcmVkLHBldC5maWx0ZXJlZCkNCm1vZGlzLmZpbHRlcmVkJFBST0RVQ1QgPC0gYXMuZmFjdG9yKG1vZGlzLmZpbHRlcmVkJFBST0RVQ1QpDQpzdHIobW9kaXMuZmlsdGVyZWQpDQoNCmBgYA0KRmluYWxseSAsIGpvaW4gdGhlIG9ic2VydmF0aW9ucyB0byB0aGUgU2l0ZSBMaXN0IG9uIHRoZSBsYXRpdHVkZSBjb2x1bW46DQpgYGB7cn0NCm1vZGlzLmZ1bGwgPC0gZnVsbF9qb2luKGJhbXMuc2l0ZXMsIG1vZGlzLmZpbHRlcmVkLCBieSA9YygiTEFUIiwiTE9ORyIpKQ0Kc3RyKG1vZGlzLmZ1bGwpDQpgYGANCkZpbmlzaGVkISBTYXZlIGFzIC5jc3YNCmBgYHtyIHdhcm5pbmc9RkFMU0UsIG1lc3NhZ2U9RkFMU0V9DQojIHNldCB3ZA0Kc2V0d2QoIkM6L1VzZXJzL0dhdmluIE1jTmljb2wvQm94IFN5bmMvTU9ESVMgRGF0YS9BcHBFRUFSUyBEYXRhL2JhbXMtc2l0ZXMiKQ0Kd3JpdGUuY3N2KG1vZGlzLmZ1bGwsICJiYW1zX3NpdGVzX01PRElTX2Z1bGwuY3N2IikNCmBgYA0KDQoNCg0KDQo=